home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
cd2pcmt
/
source.lzh
/
cd2pcm.c
< prev
next >
Wrap
Text File
|
1997-10-03
|
29KB
|
1,005 lines
/*--------------------------------------------------------------*/
/* */
/* */
/* */
/* CD2PCMt.x: 一応汎用CD-ROM CD-DA DATA 読み込みProg. */
/* */
/* Copyright 1995-96 TNB製作所 */
/* */
/* */
/* */
/* Orig. */
/* cd2pcm.x: SONY CDU-561・CDU-55S & TOSHIBA XM-3401TA・XM-4101TA*/
/* オーディオデータ取り込みプログラム Ver 0.8a */
/* Copyright(c) 1993-1994 WATA (渡邉 正治) */
/* Made in Osaka. */
/* */
/* */
/* PCM SUB. PCMLIB.A ver 1.03a written by GORRY */
/* adpcmlib.a ver 0.01 (C) Otankonas */
/* */
/* */
/*--------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <TNB.H>
#include "cd2pcm.h"
#include "extern.h"
static char outfile_pcm[] = "TEST.P16";
static char outfile_adpcm[] = "TEST.PCM";
static char outfile_wave[] = "TEST.WAV";
static char outfile_s44[] = "TEST.S44";
static char outfile_a44[] = "TEST.A44";
static char outfile_m44[] = "TEST.M44";
static char outfile_s22[] = "TEST.S22";
static char outfile_a22[] = "TEST.A22";
static char outfile_a88[] = "TEST.A88";
void main( int argc, char *argv[] )
{
int i,j,mode,min,max,dmy,adr;
int start,end,music_no;
int tstart,tend,shigh,smid,slow,ehigh,emid,elow;
char *arg;
char *ptr; /* 環境変数 "CD-ROM" のポインター */
char buf[256];
unsigned char buf2[256];
int of = 0;
printf(
"X68k CDtoPCM [CD2PCMt.x] Version 0.96A Copyright 1995-1997 TNB製作所\n"
" Orig. cd2pcm Ver 0.8a Copyright (c) 1993-1994 by WATA\n"
);
/* 変数初期化 */
mode = cd_演奏情報;
SCSI_ID = -1;
CDC_ID = -1;
adr_offset = 0; /* デフォルトセット */
waru = 16; /* デフォルトセット */
convert_mode = CONVERT_M; /* デフォルトセット */
outfile = NULL;
pcm_mode = CONVERT_PCM15;
adpcm_flg = 1; /* 1;ADPCM 0;PCM 2;WAVE */
cd_speed = -1; /* 現在の速度で取り込む */
check_fg = 0; /* チェックしない。*/
disp_fg = 0; /* 表示する。 */
buf_size = -1; /* MEM取れるだけ */
write_size = 0; /* DISKに書き込んだサイズ*/
CDROM_DRIVE = -1;
retry_fg = 0; /* -retry[n] 取り込みエラーが出た場合[n]回挑戦*/
errjmp_fg = 0; /* 致命的でないエラーは無視します。*/
errod_fg = 0; /* -ejjod */
pcm_rate = -1; /* -rate 0;15625 変換レート*/
secone_fg = 0;
inqu_sw = -1;
evn = 0; /*環境変数チェック*/
retry_mx = 0; /* エラーの最大リトライ数 */
errjmp_mx = 0; /* 致命的でないエラーの数 */
fcmppr = 0; /* 比較時の一致とみなす一致パーセント数 */
dma_fg = 1; /* DMAC使用フラグ*/
sct_fg = 0; /* SCSITAI 使用フラグ*/
stm_fg = 0; /* SCSITAI & マニュアル転送フラグ*/
mach2_fg = 0; /* Mach2 フラグ*/
test_fg = 0; /* test フラグ */
merc_fg = 0; /* まーきゅりフラグ*/
cdspeed = 0; /* MMC 対応 スピード*/
MT_bak[0] = 0xFF;
/* オプション解析処理 */
for(i=1;;i++){
if ( evn && i>=argc )
break;
if ( (arg=SwitchDisp(i,argc,argv))==0 )
break;
if ( arg[0] == '-' || arg[0] == '/' ){
switch(arg[1]|0x20){
case 's':
if ( stricmp( "ony" ,&arg[2] ) == 0 ){
CDROM_DRIVE=CD_CDU561;
inqu_sw = 1;
} else if ( stricmp( "econe" ,&arg[2] ) == 0 ){
secone_fg=-1;
} else if ( arg[2] == 0 ){
mode = cd_演奏中断;
} else {
printf("オプションエラーです。\n" );
exit(1);
}
break;
case 'd':
if ( stricmp( "ma" ,&arg[2] ) == 0 ){
dma_fg = 1; /* DMAC使用フラグ*/
} else {
printf("オプションエラーです。\n" );
exit(1);
}
break;
case 't':
if ( stricmp( "est" ,&arg[2] ) == 0 ){
test_fg=1; /* 転送テストフラグ*/
} else if ( stricmp( "oshiba" ,&arg[2] ) == 0 ){
CDROM_DRIVE=TOSHIBATYPE;
inqu_sw = 1;
} else {
printf("オプションエラーです。\n" );
exit(1);
}
break;
case 'c':
if ( strncmp( "dspeed" ,&arg[2],6 ) == 0 ){
if ( sscanf( &arg[8],"%d", &cdspeed )!=1 ){
printf("cdspeed 値がありません。\n");
exit(1);
}
if ( cdspeed<1 || cdspeed>30 ){
printf("cdspeed 値が異常です。\n");
exit(1);
}
} else if ( strncmp( "hkp" ,&arg[2],3 ) == 0 ){
if ( sscanf( &arg[5],"%d", &fcmppr )!=1 ){
printf("chkp 値がありません。\n");
exit(1);
}
if ( fcmppr<0 || fcmppr>100 ){
printf("chkp 値が異常です。\n");
exit(1);
}
} else if ( stricmp( "heck" ,&arg[2] ) == 0 ){
check_fg = 1;
} else if ( stricmp( "hecks" ,&arg[2] ) == 0 ){
check_fg = 2;
} else if ( arg[2] == 0 ){
mode = cd_演奏再開;
} else {
printf("オプションエラーです。\n" );
exit(1);
}
break;
case 'l':
if ( (arg[2]|0x20) == 'e' ){
convert_mode = CONVERT_L;
adr_offset = 0;
} else {
mode = cd_演奏リスト;
}
break;
case 'i':
if ( (arg[2]|0x20)=='d' ){
SCSI_ID = arg[3] - '0';
if ( SCSI_ID<0 || SCSI_ID>9 ) {
j=(arg[3]|0x20) - 'a';
if ( j>=0 && j<=5 ){
SCSI_ID = 10 + j;
} else {
printf(" SCSI-ID が異常です。\n");
exit(1);
}
} else {
j=arg[4] - '0';
if ( j>=0 && j<=15 )
SCSI_ID = SCSI_ID*10 + j;
if ( SCSI_ID<0 || SCSI_ID>15 ){
printf(" SCSI-ID が異常です。\n");
exit(1);
}
}
} else {
SCSI_ID = arg[2] - '0';
if ( SCSI_ID<0 || SCSI_ID>9 ) {
j=(arg[2]|0x20) - 'a';
if ( j>=0 && j<=5 ){
SCSI_ID = 10 + j;
} else {
printf(" SCSI-ID が異常です。\n");
exit(1);
}
} else {
j=arg[3] - '0';
if ( j>=0 && j<=15 )
SCSI_ID = SCSI_ID*10 + j;
if ( SCSI_ID<0 || SCSI_ID>15 ){
printf(" SCSI-ID が異常です。\n");
exit(1);
}
}
}
break;
case 'h':
if ( strncmp( "rate" ,&arg[2],4 ) == 0 ){
pcm_rate = 22050;
break;
}
cd2pcm_help();
exit(0);
break;
case '?':
cd2pcm_help();
exit(0);
break;
case 'g':
if ( (arg[2]|0x20) == 't' ){
mode = cd_取り込み2;
switch( sscanf( &arg[3],"%d/%d%1s%d%1s%d%1s%d%1s%d%1s%d",
&music_no,
&shigh,&buf[0],&smid,&buf[1],&slow,&buf[2],
&ehigh,&buf[3],&emid,&buf[4],&elow ) )
{
case 12:
tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
tstart = tstart - ( 2 * 75 );
tend = ( ehigh * 60 * 75 ) + ( emid * 75 ) + elow ;
tend = tend - ( 2 * 75 );
if ( buf[0]!=':' || buf[1]!=':' || buf[2]!='-' ||
buf[3]!=':' || buf[4]!=':' || slow>=75 ||
elow>=75 || smid>=60 || emid>=60 ||
tstart<-150 || tend<=-150 || tstart>=tend ||
music_no<=0 )
{
printf("読み込み時間の設定が異常です。\n" );
exit(1);
}
break;
case 7:
tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
tstart = tstart - ( 2 * 75 );
tend = -1;
if ( buf[0] != ':' || buf[1] != ':' || buf[2] != '-' ||
slow >= 75 || smid >=60 || tstart < -150 ||
music_no <= 0 )
{
printf("読み込み時間の設定が異常です。\n" );
exit(1);
}
break;
default:
music_no = 0;
switch( sscanf( &arg[3],"%d%1s%d%1s%d%1s%d%1s%d%1s%d",
&shigh,&buf[0],&smid,&buf[1],&slow,&buf[2],
&ehigh,&buf[3],&emid,&buf[4],&elow ) )
{
case 11:
tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
tstart = tstart - ( 2 * 75 );
tend = ( ehigh * 60 * 75 ) + ( emid * 75 ) + elow ;
tend = tend - ( 2 * 75 );
if ( buf[0] != ':' || buf[1] != ':' || buf[2] != '-' ||
buf[3] != ':' || buf[4] != ':' || slow >= 75 ||
elow >= 75 || smid >=60 || emid >=60 ||
tstart < 0 || tend <= 0 || tstart >= tend )
{
printf("読み込み時間の設定が異常です。\n" );
exit(1);
}
break;
case 6:
tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
tstart = tstart - ( 2 * 75 );
tend = -1;
if ( buf[0] != ':' || buf[1] != ':' || buf[2] != '-' ||
slow >= 75 || smid >=60 || tstart < 0 )
{
printf("読み込み時間の設定が異常です。\n" );
exit(1);
}
break;
default:
printf("読み込み時間の設定が異常です。\n" );
exit(1);
break;
}
}
} else {
mode = cd_取り込み;
switch( sscanf( &arg[2],"%d",&music_no ) ){
case 1:
break;
default:
printf("曲番号の指定が異常です。\n" );
exit(1);
break;
}
}
break;
case 'o':
outfile = &arg[2];
of = -1;
break;
case 'p':
if ( stricmp( "n" , &arg[2] ) == 0 ){
disp_fg = 1;
break;
}
if ( stricmp( "cms" ,&arg[2] ) == 0 ){
pcm_mode = 0;
adpcm_flg = 0;
if ( of==0 ) outfile = outfile_s44;
break;
}
if ( stricmp( "cma" ,&arg[2] ) == 0 ){
pcm_mode = CONVERT_PCMA;
adpcm_flg = 0;
if ( of==0 ) outfile = outfile_a44;
break;
}
if ( stricmp( "cmr" ,&arg[2] ) == 0 ){
pcm_mode = CONVERT_PCMR;
adpcm_flg = 0;
if ( of==0 ) outfile = outfile_m44;
break;
}
if ( stricmp( "cml" ,&arg[2] ) == 0 ){
pcm_mode = CONVERT_PCML;
adpcm_flg = 0;
if ( of==0 ) outfile = outfile_m44;
break;
}
if ( stricmp( "cmm" ,&arg[2] ) == 0 ){
pcm_mode = CONVERT_PCMM;
adpcm_flg = 0;
if ( of==0 ) outfile = outfile_m44;
break;
}
if ( stricmp( "cm15" ,&arg[2] ) == 0 ) {
pcm_mode = CONVERT_PCM15;
adpcm_flg = 0;
break;
}
printf("オプションエラーです。\n" );
exit(1);
break;
case 'e':
if ( stricmp( "rrjmp" ,&arg[2] ) == 0 ){
errjmp_fg = 1; /* 致命的でないエラーは無視します。*/
} else if ( stricmp( "rrod" ,&arg[2] ) == 0 ){
errod_fg= 1;
} else if ( stricmp( "nv" ,&arg[2] ) == 0 ){
evn= 1;
} else {
printf("オプションエラーです。\n" );
exit(1);
}
break;
case 'r':
strlwr( &arg[1] );
if ( strncmp( "ate" ,&arg[2],3 ) == 0 ){
if ( sscanf( &arg[5],"%d", &pcm_rate )!=1 ){
printf(" rate 値が異常です。\n");
exit(1);
}
if ( pcm_rate >= 1 && pcm_rate<=441 ){
pcm_rate*=100;
} else if ( pcm_rate >= 3900 && pcm_rate<=44100 ){
;
} else {
printf(" rate 値が異常です。\n");
exit(1);
}
break;
} else if ( strncmp( "etry" ,&arg[2],4 ) == 0 ){
if ( sscanf( &arg[6],"%d", &retry_fg )!=1 ){
printf(" retry 値が異常です。\n");
exit(1);
}
if ( retry_fg < 1 || retry_fg > 60000 ){
printf(" retry 値が異常です。\n");
exit(1);
}
break;
} else if ( arg[2] == 0 ){
convert_mode = CONVERT_R;
adr_offset = 2;
break;
} else if ( stricmp( "ight" ,&arg[2] ) == 0 ){
convert_mode = CONVERT_R;
adr_offset = 2;
break;
} else {
printf("オプションエラーです。\n" );
exit(1);
}
break;
case 'm':
if ( stricmp( "br7" ,&arg[2] ) == 0 ){
mbr7f=1;
break;
} else if ( stricmp( "erc" ,&arg[2] ) == 0 ){
merc_fg=1;
break;
} else if ( stricmp( "ix" ,&arg[2] ) == 0 ){
convert_mode = CONVERT_M;
break;
} else if ( stricmp( "an" ,&arg[2] ) == 0 ){
stm_fg=1; /* SCSITAI & マニュアル転送フラグ*/
break;
} else if ( stricmp( "pu" ,&arg[2] ) == 0 ){
dma_fg = 0; /* DMAC使用フラグ*/
break;
}
if ( (arg[2]|0x20) == 'a' ){
buf_size = -1; /* 最大 */
break;
}
/* -mN Nは、数字で N秒分のワーク */
switch( sscanf( &arg[2],"%d", &buf_size ) ){
case 1:
if ( buf_size == 0 ){
printf("-m[n] の値が異常です。\n" );
exit(1);
break;
}
break;
default:
printf("-m[n] の値が異常です。\n" );
exit(1);
break;
}
break;
case 'a':
switch(arg[2]|0x20){
case 'r':
convert_mode = CONVERT_AVE_R;
//adr_offset = 2;
break;
case 'l':
convert_mode = CONVERT_AVE_L;
//adr_offset = 0;
break;
case 'm':
convert_mode = CONVERT_AVE_M;
break;
case 'd':
if ( stricmp("pcm", &arg[3]) == 0 ){
pcm_mode = CONVERT_PCM15;
adpcm_flg = 1;
if ( of==0 ) outfile = outfile_adpcm;
break;
} else {
printf("オプションエラーです。\n" );
exit(1);
}
case '8':
if ( stricmp("8", &arg[3]) == 0 ){
pcm_mode = CONVERT_A88;
adpcm_flg = 1;
if ( of==0 ) outfile = outfile_a88;
break;
}
default:
printf("オプションエラーです。\n" );
exit(1);
}
break;
case 'n':
cd_speed = 0;
break;
case 'f':
cd_speed = 1;
break;
case 'u':
cd_speed = 2;
break;
case 'v':
if ( sscanf( &arg[2],"%d", &waru )!=1 ){
printf(" 音量調節(-v)の値が異常です。\n");
exit(1);
break;
}
if ( waru == 0 || waru > 256 ){
printf(" 音量調節(-v)の値が異常です。\n");
exit(1);
}
break;
case 'w':
if ( stricmp( "ave" ,&arg[2] ) == 0 ){
pcm_mode = CONVERT_WAVE;
adpcm_flg = 2;
if ( of==0 ) outfile = outfile_wave;
} else {
printf("オプションエラーです。\n" );
exit(1);
}
break;
default:
printf("オプションエラーです。\n" );
//if ( sscanf( &arg[1],"%d", &waru )!=1 ){
// printf("音量調節の入力がへん\n");
// exit(1);
// break;
//}
//if ( waru == 0 || waru > 256 ){
// printf("音量調節の入力がへん\n");
// exit(1);
//}
break;
}
} else {
if ( stricmp( "all", &arg[0] ) == 0 ){
mode = cd_演奏開始_ALL; /* ALL 演奏 */
} else {
mode = cd_演奏開始2;
/* 演奏時間オフセットチェック */
switch( sscanf( &arg[0],"%d/%d:%d:%d%1s%d:%d:%d",
&music_no,
&shigh,&smid,&slow,&buf[2],
&ehigh,&emid,&elow ) )
{
case 8:
tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
tend = ( ehigh * 60 * 75 ) + ( emid * 75 ) + elow ;
if ( buf[2] != '-' || slow >= 75 ||
elow >= 75 || smid >=60 || emid >=60 ||
tstart < 0 || tend <= 0 || tstart >= tend ||
music_no <= 0 )
{
printf("演奏時間の設定が異常です。\n" );
exit(1);
}
break;
case 5:
tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
tend = -1;
if ( buf[2] != '-' ||
slow >= 75 || smid >=60 || tstart < 0 || start <= 0 )
{
printf("演奏時間の設定が異常です。\n" );
exit(1);
}
break;
default:
music_no = 0;
switch( sscanf( &arg[0],"%d:%d:%d%1s%d:%d:%d",
&shigh,&smid,&slow,&buf[2],
&ehigh,&emid,&elow ) )
{
case 7:
tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
tend = ( ehigh * 60 * 75 ) + ( emid * 75 ) + elow ;
if ( buf[2] != '-' ||
slow >= 75 ||
elow >= 75 || smid >=60 || emid >=60 ||
tstart < 0 || tend <= 0 || tstart >= tend )
{
printf("演奏時間の設定が異常です。\n" );
exit(1);
}
break;
case 4:
tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
tend = -1;
if ( buf[2] != '-' ||
slow >= 75 || smid >=60 || tstart < 0 )
{
printf("演奏時間の設定が異常です。\n" );
exit(1);
}
break;
default:
mode = cd_演奏開始;
if ( sscanf( &arg[0],"%d%1s%d", &start,buf,&end )==3 ){
if ( start >= end || buf[0] != '-' ){
printf("曲番号の指定が異常です。\n");
exit(1);
}
} else if ( sscanf( &arg[0],"%d%1s", &start,buf )==2 ){
if ( buf[0] != '-' ){
printf("曲番号の指定が異常です。\n");
exit(1);
}
end = -1; /* 最後まで */
} else if ( sscanf( &arg[0],"%d", &start )==1 ){
end=start;
} else {
printf("曲番号の指定が異常です。\n");
exit(1);
}
}
}
}
}
}
/* オプション解析処理 終了 */
if ( test_fg!=0 || merc_fg!=0 ){
/*テストフラグ*/
pcm_mode = 0;
adpcm_flg = 0;
pcm_rate = -1; /* -rate 0;15625 変換レート*/
check_fg = 0;
test_fg = -1;
}
if ( pcm_mode==0 || pcm_mode==CONVERT_PCMA || pcm_mode==CONVERT_WAVE ){
if ( pcm_rate<0 ){
pcm_rate = 44100;
} else if ( pcm_rate == 22050 ){
if ( of==0 ){
if ( pcm_mode==0 )
outfile = outfile_s22;
else if ( pcm_mode==CONVERT_PCMA )
outfile = outfile_a22;
else outfile = outfile_wave;
}
} else {
printf(" rate の指定が異常です。\n");
exit(1);
}
} else {
if ( pcm_rate<0 )
pcm_rate = 15625; /* -rate 0;15625 変換レート*/
}
if ( outfile == NULL ){
if ( adpcm_flg == 0 )
outfile = outfile_pcm; /* デフォルトファイル名セット */
else if ( adpcm_flg == 1 )
outfile = outfile_adpcm; /* デフォルトファイル名セット */
else outfile = outfile_wave; /* デフォルトファイル名セット */
}
CDC_ID =CDCID();
if ( CDC_ID >=0 )
CDC_ID &= 0x00FFFFFF;
if ( SCSI_ID == -1 )
SCSI_ID = CDC_ID;
if ( SCSI_ID == -1 ){
SCSI_ID = DEF_SCSI_ID; /* デフォルトを仮設定 */
ptr = (char *)getenv( "MUSIC-CDROM" );
if ( ptr == NULL )
ptr = (char *)getenv( "CDROM" ) ;
if ( ptr != NULL ){
SCSI_ID = ptr[0] - '0';
if ( SCSI_ID<0 || SCSI_ID>9 ) {
i=(ptr[0]|0x20) - 'a';
if ( i>=0 && i<=5 ){
SCSI_ID = 10 + i;
} else {
printf("環境変数 `CDROM' が正しく設定されていません。\n");
exit(1);
}
} else {
i=ptr[1] - '0';
if ( i>=0 && i<=9 )
SCSI_ID = SCSI_ID*10 + i;
if ( SCSI_ID<0 || SCSI_ID>15 ) {
printf("環境変数 `CDROM' が正しく設定されていません。\n");
exit(1);
}
}
}
}
if ( S_TW_CHK()!=-2 )
i=S_LEVEL_();
else i=S_TW_LEVEL(SCSI_ID);
if ( dma_fg==0 ){
// MPU 転送
if ( (i&0xFF00)==0x5400 && (i&0xFF)>=1 ){
if ( stm_fg == 0 )
sct_fg = 1; /* SCSITAI 使用フラグ*/
}
} else {
// DMA 転送
sct_fg = 0; /* SCSITAI 使用フラグ*/
stm_fg = 0; /* SCSITAI & マニュアル転送フラグ*/
if ( (i&0xFF00)==0x6400 )
mach2_fg = 1; /* Mach2 フラグ*/
}
sprintf(pcm_rate_str,"%.3f",(double)pcm_rate/1000.);
breakmd=BREAKCK(-1); /* 起動時のbreak状態 */
INTVCS(0xFFF1,(void*)AbortDisp);
/* 装置動作可能かチェックする */
for( i=0;i<5;i++ ){
/*-- メディアチェック --*/
/*まず inq.データの大きさを調べる*/
if ( S_INQUIRY( 5, SCSI_ID, (void*)buf2 ) != 0 ){
printf("指定された SCSI-ID=%d ",SCSI_ID&0xFF );
if ( SCSI_ID&0xFFFF0000 )
printf("LUN=%d ",SCSI_ID/0x10000 );
printf("の INQUIRY に失敗しました。\n");
EndtDisp(1);
}
/*inq.データの大きさ分読み込む*/
if ( S_INQUIRY( buf2[4]+5, SCSI_ID, (void*)buf ) != 0 ){
printf("指定された SCSI-ID=%d ",SCSI_ID&0xFF );
if ( SCSI_ID&0xFFFF0000 )
printf("LUN=%d ",SCSI_ID/0x10000 );
printf("の INQUIRY に失敗しました。\n");
EndtDisp(1);
}
if ( buf[0]!=0x05 && buf[0]!=0x04 ){
printf("指定された SCSI-ID=%d ",SCSI_ID&0xFF );
if ( SCSI_ID&0xFFFF0000 )
printf("LUN=%d ",SCSI_ID/0x10000 );
printf("の装置は、CD-ROM ではないようです。\n");
EndtDisp(1);
}
if ( CDROM_DRIVE<0 ){
if ( memcmp( "SONY CD-ROM CDU-561", &buf[8],22 ) == 0 ){
CDROM_DRIVE = CD_CDU561;
} else if ( memcmp( "SONY CD-ROM CDU-55S", &buf[8],22)==0){
CDROM_DRIVE = CD_CDU561;
} else if ( memcmp( "NRC MBR-7", &buf[8],13)==0){
CDROM_DRIVE = CD_CDU561;
} else if ( memcmp( "MATSHITAPD-1 LF", &buf[8],15)==0){
CDROM_DRIVE = CD_CDU561;
} else if ( memcmp( "TOSHIBA CD-ROM XM-3401TA", &buf[8],24)==0){
CDROM_DRIVE = TOSHIBATYPE;
} else if ( memcmp( "TOSHIBA CD-ROM XM-4101TA", &buf[8],24)==0){
CDROM_DRIVE = TOSHIBATYPE;
} else {
CDROM_DRIVE = -1;
}
}
/* 装置動作可能かチェック */
j=S_TESTUNIT(SCSI_ID);
if ( j!=0 && j!=1 )
continue;
/* 演奏するでえ */
switch( mode ){
case cd_演奏開始:
cd_play(start,end);
CDCRESET();
EndtDisp0(0);
case cd_演奏開始2:
cd_play2(music_no,tstart,tend);
CDCRESET();
EndtDisp0(0);
case cd_演奏開始_ALL:
cd_play_all();
CDCRESET();
EndtDisp0(0);
case cd_演奏中断:
cd_play_pause();
CDCRESET();
EndtDisp0(0);
case cd_演奏再開:
cd_play_resume();
CDCRESET();
EndtDisp0(0);
case cd_演奏情報:
cd_play_inf();
EndtDisp0(0);
case cd_演奏リスト:
cd_play_list();
EndtDisp0(0);
case cd_取り込み:
if ( RedTOC( &dmy, &min, &max )!= 0 ){
printf(" Read TOC でエラーが発生しました。\n");
EndtDisp(1);
}
if ( music_no < min || music_no > max ){
printf("番号の設定が異常です。\n");
printf("曲番号は %d ~ %d まで有効です。\n",min, max );
EndtDisp(1);
}
if ( CDROM_DRIVE == -1 ){
CDROM_DRIVE = SONYTYPE;
//printf("現在 %s は、",&buf[8]);
//printf("サポート出来ないか、していません。\n");
//EndtDisp(1);
}
cdda2pcm( music_no, 0,0 ); /* 取り込む */
EndtDisp(0);
case cd_取り込み2:
if ( CDROM_DRIVE == -1 ){
CDROM_DRIVE = SONYTYPE;
//printf("現在 %s は、",&buf[8]);
//printf("サポート出来ないか、していません。\n");
//EndtDisp(1);
}
if ( music_no != 0 ){
if ( RedTOC( &dmy, &min, &max ) != 0 ){
printf(" Read TOC でエラーが発生しました。\n");
EndtDisp(1);
}
if ( music_no < min || music_no > max ){
printf("番号の設定が異常です。\n" );
printf("曲番号は %d ~ %d まで有効です。\n", min, max );
EndtDisp(1);
} else {
if ( Music_inf( music_no, &adr ) == 0 ){
tstart = tstart + time2bin(adr);
if ( tend != -1 )
tend = tend + time2bin(adr);
} else {
printf( "Start Track Address or ReadTOC Command error "
"のため演奏時間は分かりませんでした。\n"
);
EndtDisp(1);
}
}
}
cdda2pcm( -1, tstart, tend ); /* 取り込む */
EndtDisp(0);
}
EndtDisp(0);
}
j=S_TESTUNIT(SCSI_ID);
printf("指定された SCSI-ID=%d ",SCSI_ID&0xFF);
if ( SCSI_ID&0xFFFF0000 )
printf("LUN=%d ",SCSI_ID/0x10000 );
if ( j<0 )
printf("の装置は、現在動作不可能です。\n");
else printf("の装置にメディアが未挿入です。\n");
EndtDisp(1);
}
/****************************************/
/* Print */
/****************************************/
void printf_(d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12)
int d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12;
{
if ( disp_fg==0 )
printf((void*)d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12);
}
/****************************************/
/* ABORT 終了 */
/****************************************/
void AbortDisp()
{
C_CURON(); /* カーソルON */
S_RESET();
S_REZEROUNIT(SCSI_ID);
BREAKCK(breakmd);
printf("\x1B""0");
printf("\n"CFC"CD2PCMt.x : アボートしました。\n");
KFLUSHIO(0xFF);
exit(1);
}
/*+++++++*/
void EndtDisp0(int ec)
{
C_CURON(); /* カーソルON */
if ( MT_bak[0]!=0xFF )
S_MODESELECT( PF, 12, SCSI_ID, MT_bak );
KFLUSHIO(0xFF);
printf("\x1B""0");
exit(ec);
}
/*+++++++*/
void EndtDisp(int ec)
{
C_CURON(); /* カーソルON */
S_REZEROUNIT(SCSI_ID);
if ( MT_bak[0]!=0xFF )
S_MODESELECT( PF, 12, SCSI_ID, MT_bak );
KFLUSHIO(0xFF);
printf("\x1B""0");
exit(ec);
}
/*************************************************************************
スイッチ処理
*************************************************************************/
char *SwitchDisp(n,argc,argv)
int n;
int argc;
char *argv[];
{
static char ss[256];
int i,j;
if ( n<argc )
return(argv[n]);
n-=argc;
if ( GETENV("CD2PCM",0,ss)<0 ) /*本当は起動時1回だけ実行すれば良いが手抜き*/
return(0);
for(i=j=0;ss[i]==0x20;i++);
if ( n!=0 ){
for(;;i++){
if ( ss[i]==' ' ){
while( ss[++i]==' ' );
if ( ++j==n )
break;
}
if ( ss[i]==0 )
return(0);
}
}
for(j=i;ss[j]!=0&&ss[j]!=' ';j++);
ss[j]=0;
return( &ss[i] );
}
/****************************************/
/* ヘルプ表示 */
/****************************************/
void cd2pcm_help( void )
{
printf( "\n"
"使用法:CD2PCMt.x [options] [曲番号] [演奏開始時間-終了時間] [ALL]\n"
" 曲番号 : 演奏するCDの曲番号を指定します。\n"
" u:v:w- : u分v秒w~最後まで演奏します。\n"
" u:v:w-x:y:z : u分v秒w~x分y秒zまで演奏します。\n"
" ?/u:v:x : ? 曲目のu分v秒w~最後まで演奏します。\n"
" ?/u:v:w-x:y:z : ? 曲目のu分v秒w~x分y秒zまで演奏します。\n"
" ALL : 全曲演奏します。\n"
"{options}\n"
" -s : 演奏中断します。\n"
" -c : 演奏再開します。\n"
" -l : 演奏時間を表示します。\n"
// " -i[x] : SCSI-IDを設定します。\n"
" -id[x] : SCSI-IDを設定します。\n"
"\n"
" -g[x] : [x] 曲目のオーディオデータを読み込みます。\n"
" -gt[u]:[v]:[w]- : [u]分[v]秒[w]~最後までのAUDIO-DATAを読み込みます。\n"
" -gt[u]:[v]:[w]-[x]:[y]:[z]\n"
" : [u]分[v]秒[w]~[x]分[y]秒[z]までのAUDIO-DATAを読み込みます。\n"
" -gt[?]/[u]:[v]:[w]-\n"
" : [?] 曲目の[u]分[v]秒[w]~最後までのAUDIO-DATAを読み込みます。\n"
" -gt[?]/[u]:[v]:[w]-[x]:[y]:[z]\n"
" : [?] 曲目の[u]分[v]秒[w]~[x]分[y]秒[z]までのAUDIO-DATAを読み込みます。\n"
"\n"
" 以下のオプションは、-g 又は -gt が指定された時のみ有効です。\n"
" -test : 読み込みテストのみします。ファイルを作りません。\n"
" -pn : 実行中の表示を行いません。\n"
" -o[filename] : 出力ファイル名の指定。-o の後に空白を空けずに指定します。\n"
" 指定しなければ、test.* となります(拡張子は記録モードによる)。\n"
" -ma : メモリに読み込める限り読み込んで処理を行います(def.)。\n"
" -m[n] : [n]秒分読み込んで処理を行います。\n"
" -check : 数回データを読み込み、比較してより正しいデータを得ます。\n"
" -checks : 数回データを読み込み、比較して非常に正しいデータを得ます。\n"
/// " -chkp[n] : 比較の時n%同じなら一致したとします。\n"
" -secone : 1セクタ毎読み込む様にします。\n"
" -retry[n] : 読み込みエラーが出た場合、[n]回挑戦します。\n"
" -errjmp : 致命的でないエラーは無視します。\n"
" -errod : -errjmp で無視したエラーセクタのデータは前データのものを使用します。\n"
// " -mbr7 : エラーの際、ZEROUNIT & SEEK を実行します。\n"
"\n"
/// " -dma : 読み込みに DMA を使用します。\n"
" -mpu : 読み込みに MPU を使用します。\n"
"\n"
// " -sony : SONY系のRead CD-DA命令を使用します(def.=デバイスのInquiryで判断)。\n"
" -toshiba : TOSHIBA系のRead CD-DA命令を使用します(def.= SONY系のRead CD-DA を使用)。\n"
"\n"
" -normal : 標準速で読み込みます。\t\tCDU-561&55S の時のみ有効です。\n"
" -fast : 倍速で読み込みます。\t\tCDU-561&55S の時のみ有効です。\n"
" -ultra : 最大速で読み込みます。\t\tCDU-561&55S の時のみ有効です。\n"
" -cdspeed[n] : 読み込み速度を指定します。\t\tMMC 対応ドライブのみ有効です。\n"
"\n"
" -pcms : 44.1kHz 16bit ステレオの PCM(ベタ)で記録します[*.S44]。\n"
" -pcma : 44.1kHz 16bit ステレオの ADPCM で記録します[*.A44]。\n"
" -pcmr : 44.1kHz 16bit 右のみを PCM(ベタ)で記録します[*.M44]。\n"
" -pcml : 44.1kHz 16bit 左のみを PCM(ベタ)で記録します[*.M44]。\n"
" -pcmm : 44.1kHz 16bit 左右ミキシング PCM(ベタ)で記録します[*.M44]。\n"
" -wave : 44.1kHz 16bit ステレオの WAVE 型式で記録します[*.WAV]。\n"
/// " -a88 : 88.2kHz 16bit ステレオの ADPCM で記録します[*.A88]。\n"
" -pcm15 : 15.6kHz 16BIT PCM に変換し記録します[*.P16]。\n"
" -adpcm : 15.6kHz ADPCM に変換し記録します[*.PCM](def.)。\n"
"\n"
" 以下のオプションは、-pcms or -pcma or -wave が指定された時のみ有効です。\n"
" -hrate : ハーフレート(22.05kHz)にします。\n"
"\n"
" 以下のオプションは、-pcm15 or -adpcm が指定された時のみ有効です。\n"
// " -数値 : 音量を調節します。小さいほど音は大きくなります(def.16)\n"
" -v[数値] : 音量を調節します。小さいほど音は大きくなります(def.16)\n"
" -rate[数値] : 変換レートを指定します(def.=15625{15.625kHz})。\n"
" -mix : 左右をミキシングして記録します(def.)。\n"
" -right : 右のみを記録します。\n"
" -left : 左のみ記録します。\n"
" -am : 左右をミキシング、補間処理して記録します。\n"
" -ar : 右のみを補間処理して記録します。\n"
" -al : 左のみを補間処理して記録します。\n"
"\n"
" -env : 環境変数 CD2PCM を参照しません。\n"
"\n"
" 環境変数 CD2PCM の内容がコマンドラインの最後に追加されます\n"
);
}
asm("
.XDEF _STACK_SIZE
_STACK_SIZE EQU 32*1024
.XDEF _HEAP_SIZE
_HEAP_SIZE EQU 8*1024
");